/*
给定一个 m x n 的矩阵，如果一个元素为 0 ，则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。

 

示例 1：


输入：matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出：[[1,0,1],[0,0,0],[1,0,1]]
示例 2：


输入：matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
输出：[[0,0,0,0],[0,4,5,0],[0,3,1,0]]
 

提示：

m == matrix.length
n == matrix[0].length
1 <= m, n <= 200
-231 <= matrix[i][j] <= 231 - 1
 

进阶：

一个直观的解决方案是使用  O(mn) 的额外空间，但这并不是一个好的解决方案。
一个简单的改进方案是使用 O(m + n) 的额外空间，但这仍然不是最好的解决方案。
你能想出一个仅使用常量空间的解决方案吗？

*/

class Solution {
public:
    void setZeroes(vector<vector<int>>& a) {
        int m=a.size();
        int n=a[0].size(); //行数和列数

        bool fm=false,fn=false; //表示第一行第一列该不该置0

        for(int i=0;i<m;i++){
            if(!a[i][0]){
                fm=true;
            }
        }

        for(int i=0;i<n;i++){
            if(!a[0][i]){
                fn=true;
            }
        }

        for(int i=1;i<m;i++){ //若是当前位置为0则将对应的第一行和第一列的位置置0
            for(int j=1;j<n;j++){
                if(!a[i][j]){
                    a[i][0]=0;
                    a[0][j]=0;
                }
            }
        }

        for(int i=1;i<m;i++){ //若当前位置的第一行或第一列的对应为为0则将当前位置置0
            for(int j=1;j<n;j++){
                if(!a[i][0]||!a[0][j]){
                    a[i][j]=0;
                }
            }
        }

        if(fm){ //若是第一列或第一行该置0则将该位置置0
            for(int i=0;i<m;i++){
                a[i][0]=0;
            }
        }

        if(fn){
            for(int j=0;j<n;j++){
                a[0][j]=0;
            }
        }
    }
};

/*
原地算法核心：将一个矩阵的第一行和第一列当作标记数组 然后特殊处理第一行和第一列
*/